/**
 * Mock验证指导 - 防止生成未定义的Mock类
 * 
 * 问题：LLM可能生成使用未定义Mock类的代码，导致编译失败
 * 解决：提供明确的Mock定义检查清单和替代方案
 */

export class MockValidationGuidance {
    
    /**
     * 获取Mock验证的完整指导
     */
    public static getGuidance(): string {
        return `

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
## 🚨 CRITICAL: Mock类必须先定义才能使用！
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

### ❌ 常见错误：使用未定义的Mock类

\`\`\`cpp
// ❌ 错误：AccessTokenKitMock未定义
EXPECT_CALL(::testing::StaticCast<AccessTokenKitMock *>(AccessTokenKit::GetInstance().promote()), 
            VerifyAccessToken(...))
    .WillOnce(Return(...));

// 编译错误：AccessTokenKitMock was not declared in this scope
\`\`\`

**问题**：
- Mock类未定义
- 没有包含Mock头文件
- 使用了不存在的Mock

---

### ✅ 正确做法1：权限相关函数不使用Mock（推荐）

**原因**：OpenHarmony项目中，权限验证函数通常不使用Mock，而是：
- 使用\`SetNativeToken()\`设置真实权限
- 直接测试权限逻辑
- 避免Mock系统服务

\`\`\`cpp
class FileAccessServiceTest : public testing::Test {
public:
    static void SetUpTestCase(void) {
        SetNativeToken(true);  // ✅ 设置真实系统权限
    }
    
    void SetUp() override {
        instance_ = std::make_shared<FileAccessService>(FILE_ACCESS_SERVICE_ID, false);
    }
    
    // ✅ Helper: 设置Native Token权限
    static void SetNativeToken(bool isSystemApp) {
        uint64_t tokenId;
        const char *perms[] = {
            "ohos.permission.FILE_ACCESS_MANAGER",
            "ohos.permission.GET_BUNDLE_INFO_PRIVILEGED"
        };
        NativeTokenInfoParams infoInstance = {
            .dcapsNum = 0,
            .permsNum = 2,
            .aclsNum = 0,
            .dcaps = nullptr,
            .perms = perms,
            .acls = nullptr,
            .aplStr = "system_core",
        };
        infoInstance.processName = "FileAccessServiceTest";
        tokenId = GetAccessTokenId(&infoInstance);
        if (isSystemApp) {
            const uint64_t systemAppMask = (static_cast<uint64_t>(1) << 32);
            tokenId |= systemAppMask;
        }
        SetSelfTokenID(tokenId);
        Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo();
    }
    
    std::shared_ptr<FileAccessService> instance_ = nullptr;
};

/**
 * @tc.name: CheckCallingPermission 有权限
 * @tc.desc: 测试有系统权限时返回true
 */
HWTEST_F(FileAccessServiceTest, CheckCallingPermission_Granted_001, TestSize.Level1) {
    // ✅ 不使用Mock，使用真实权限系统
    bool result = instance_->CheckCallingPermission("ohos.permission.FILE_ACCESS_MANAGER");
    EXPECT_TRUE(result);
}
\`\`\`

**优点**：
- ✅ 不需要定义Mock类
- ✅ 代码可以编译和运行
- ✅ 测试真实的权限逻辑
- ✅ 符合OpenHarmony项目实践

---

### ✅ 正确做法2：如果必须Mock，完整定义Mock类

\`\`\`cpp
#include "file_access_service.h"
#include <gtest/gtest.h>
#include <gmock/gmock.h>

using namespace testing;

namespace OHOS {
namespace FileAccessFwk {

// ========== ✅ 第1步：完整定义Mock类 ==========
class MockIPCSkeleton {
public:
    MOCK_METHOD(uint32_t, GetCallingTokenID, ());
    MOCK_METHOD(uint32_t, GetCallingUid, ());
};

class MockAccessTokenKit {
public:
    MOCK_METHOD(int, VerifyAccessToken, 
                (uint32_t tokenId, const std::string& permission));
};

// ========== ✅ 第2步：在测试类中声明Mock成员 ==========
class FileAccessServiceTest : public testing::Test {
protected:
    void SetUp() override {
        mockIPCSkeleton_ = std::make_shared<MockIPCSkeleton>();
        mockAccessTokenKit_ = std::make_shared<MockAccessTokenKit>();
        // 注意：FileAccessService需要支持注入Mock依赖
        instance_ = std::make_shared<FileAccessService>(
            mockIPCSkeleton_, mockAccessTokenKit_);
    }
    
    void TearDown() override {
        mockIPCSkeleton_ = nullptr;
        mockAccessTokenKit_ = nullptr;
        instance_ = nullptr;
    }
    
    std::shared_ptr<MockIPCSkeleton> mockIPCSkeleton_ = nullptr;
    std::shared_ptr<MockAccessTokenKit> mockAccessTokenKit_ = nullptr;
    std::shared_ptr<FileAccessService> instance_ = nullptr;
};

// ========== ✅ 第3步：在测试用例中使用已定义的Mock ==========
HWTEST_F(FileAccessServiceTest, CheckCallingPermission_Granted_001, TestSize.Level1) {
    uint32_t tokenId = 123456789;
    
    // ✅ 使用已定义的Mock成员
    EXPECT_CALL(*mockIPCSkeleton_, GetCallingTokenID())
        .WillOnce(Return(tokenId));
    
    EXPECT_CALL(*mockAccessTokenKit_, VerifyAccessToken(tokenId, _))
        .WillOnce(Return(0));  // 0 = PERMISSION_GRANTED
    
    bool result = instance_->CheckCallingPermission("ohos.permission.FILE_ACCESS_MANAGER");
    EXPECT_TRUE(result);
}

} // namespace FileAccessFwk
} // namespace OHOS
\`\`\`

**注意事项**：
- ⚠️ 被测类必须支持依赖注入（构造函数接受Mock对象）
- ⚠️ 可能需要修改被测类的实现
- ⚠️ 这不是OpenHarmony项目的常见做法

---

### 🔍 Mock定义检查清单

在使用任何Mock类之前，**必须确认**：

\`\`\`markdown
□ Mock类已在当前文件或包含的头文件中定义
□ Mock类包含所有需要Mock的方法
□ Mock成员变量已在测试类的protected部分声明
□ Mock对象已在SetUp中初始化
□ 测试用例中只使用已声明的Mock成员

如果以上任何一项未满足，代码将无法编译！
\`\`\`

---

### 🎯 常见Mock类型的正确处理

#### 1. 权限相关（AccessTokenKit, IPCSkeleton）

**推荐**：❌ 不使用Mock，使用\`SetNativeToken()\`

\`\`\`cpp
// ✅ 正确
SetNativeToken(true);
bool result = instance_->CheckCallingPermission(...);

// ❌ 错误：不要Mock权限系统
EXPECT_CALL(*mockAccessTokenKit_, ...) // Mock类未定义
\`\`\`

#### 2. IPC通信（IRemoteObject, MessageParcel）

**推荐**：✅ 定义Mock类

\`\`\`cpp
// ✅ 在文件开头定义
class MockRemoteObject : public IRemoteStub<IRemoteObject> {
public:
    MOCK_METHOD(int, SendRequest, (uint32_t, MessageParcel&, MessageParcel&, MessageOption&));
};

// ✅ 在测试类中声明
protected:
    std::shared_ptr<MockRemoteObject> mockRemoteObject_ = nullptr;
\`\`\`

#### 3. 业务接口

**推荐**：✅ 定义Mock类

\`\`\`cpp
// ✅ 在文件开头定义
class MockDataProvider : public IDataProvider {
public:
    MOCK_METHOD(int32_t, FetchData, (std::vector<int>&));
    MOCK_METHOD(bool, IsValid, ());
};
\`\`\`

---

### 🚨 绝对禁止的写法

\`\`\`cpp
// ❌ 禁止1：使用未定义的Mock类
EXPECT_CALL(*mockAccessTokenKit_, VerifyAccessToken(...))  // 未定义

// ❌ 禁止2：使用复杂的转换
EXPECT_CALL(::testing::StaticCast<SomeMock *>(...), ...)  // 过于复杂

// ❌ 禁止3：Mock单例的GetInstance()
EXPECT_CALL(SomeClass::GetInstance(), ...)  // 无法Mock单例

// ❌ 禁止4：在测试函数中定义Mock类
HWTEST_F(Test, Case_001, Level1) {
    class LocalMock { ... };  // 错误位置
}
\`\`\`

---

### ✅ 正确的Mock定义位置

\`\`\`cpp
#include "my_class.h"
#include <gtest/gtest.h>
#include <gmock/gmock.h>

using namespace testing;

namespace OHOS {
namespace MyNamespace {

// ✅ 位置1：namespace内，测试类前（推荐）
class MockDependency : public IDependency {
public:
    MOCK_METHOD(int, Method, ());
};

class MyClassTest : public testing::Test {
protected:
    // ✅ 位置2：测试类的protected部分（Mock成员声明）
    std::shared_ptr<MockDependency> mockDependency_ = nullptr;
};

} // namespace MyNamespace
} // namespace OHOS
\`\`\`

---

### 📊 真实项目统计

基于10,892个测试文件的分析：

| Mock类型 | 使用Mock | 使用真实对象 | 说明 |
|---------|---------|------------|------|
| **权限系统** | <1% | >99% | 几乎不Mock，使用SetNativeToken |
| **IPC通信** | ~15% | ~85% | 部分使用Mock |
| **业务接口** | ~30% | ~70% | 根据复杂度决定 |

**结论**：
- ✅ 权限相关函数：不要Mock，使用真实权限系统
- ✅ IPC和业务接口：根据需要定义Mock
- ✅ 所有Mock类必须先定义才能使用

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

**记住：先定义Mock类，再使用！否则代码无法编译！**
`;
    }
}

